package org.monster.context.core;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * 应用类加载器实现
 *
 * @author Monster
 */
public class ApplicationClassLoaderImpl implements ApplicationClassLoader {

    /**
     * url类加载器
     */
    private URLClassLoader loader;

    /**
     * 获取根加载器
     * webapps根加载器
     *
     * @return 类加载器
     */
    public ClassLoader getRootClassLoader() {
        return getClassLoader(new File(Constants.APPS_PATH));
    }

    /**
     * 获取网类加载器
     * 获取指定项目下的classes文件夹的路径
     *
     * @param appName 应用名
     * @return 类加载器
     */
    public ClassLoader getWebClassLoader(String appName) {
        String compilePath = Constants.APPS_PATH + appName
                + Constants.COMPILE_PATH;
        return getClassLoader(new File(compilePath));
    }

    /**
     * 获取类加载器
     * 获取指定文件夹目录的加载器
     *
     * @param file 文件
     * @return 类加载器
     */
    @Override
    public ClassLoader getClassLoader(File file) {
        loader = null;
        URLStreamHandler handler = null;
        if (file.exists()) {
            try {
                URL[] urls = new URL[1];
                String urlPath = new URL("file", null, file.getCanonicalPath()
                        + File.separator).toString();
                urls[0] = new URL(null, urlPath, handler);
                loader = new URLClassLoader(urls);
            } catch (IOException ex) {
                Logger.getLogger(ApplicationClassLoaderImpl.class.getName()).log(
                        Level.SEVERE, null, ex);
            }
        }
        return loader;
    }

    /**
     * 获取 类加载器
     * 通过URL数据获取URLClassLoader
     *
     * @param url url
     * @return 类加载器
     */
    public ClassLoader getClassLoader(URL[] url) {
        loader = new URLClassLoader(url);
        return loader;
    }

    /**
     * 装载class
     *
     * @param classPath 类路径
     * @return 类
     * @throws ClassNotFoundException 类未找到异常
     */
    @Override
    public Class<?> loadClass(String classPath) throws ClassNotFoundException {
        // 装载Servlet（可以包含package路径）
        return loader.loadClass(classPath);
    }

}
